package com.imut.lagain.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.imut.lagain.entity.Message;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 消息服务接口
 */
public interface MessageService {
    
    /**
     * 发送消息
     */
    Message sendMessage(Long senderId, Long receiverId, String messageType, 
                       String content, String mediaUrl);
    
    /**
     * 发送文本消息
     */
    Message sendTextMessage(Long senderId, Long receiverId, String content);
    
    /**
     * 发送图片消息
     */
    Message sendImageMessage(Long senderId, Long receiverId, String imageUrl);
    
    /**
     * 发送语音消息
     */
    Message sendAudioMessage(Long senderId, Long receiverId, String audioUrl);
    
    /**
     * 发送系统消息
     */
    Message sendSystemMessage(Long receiverId, String content, String extraData);
    
    /**
     * 回复消息
     */
    Message replyMessage(Long senderId, Long receiverId, String content, 
                        Long replyToId, String messageType);
    
    /**
     * 获取聊天记录（分页）
     */
    IPage<Message> getChatHistory(Long userId1, Long userId2, int page, int size);
    
    /**
     * 获取用户的聊天对话列表
     */
    List<Map<String, Object>> getChatPartners(Long userId);
    
    /**
     * 获取两个用户之间的最新消息
     */
    Message getLatestMessage(Long userId1, Long userId2);
    
    /**
     * 获取用户未读消息数量
     */
    Long getUnreadMessageCount(Long userId);
    
    /**
     * 获取两个用户之间的未读消息数量
     */
    Long getUnreadMessageCountBetween(Long senderId, Long receiverId);
    
    /**
     * 标记消息为已读
     */
    boolean markAsRead(Long messageId, Long userId);
    
    /**
     * 批量标记消息为已读
     */
    boolean markAllAsReadBetween(Long senderId, Long receiverId);
    
    /**
     * 删除消息（软删除）
     */
    boolean deleteMessage(Long messageId, Long userId);
    
    /**
     * 撤回消息
     */
    boolean recallMessage(Long messageId, Long userId);
    
    /**
     * 获取指定时间范围内的消息
     */
    List<Message> getMessagesByTimeRange(Long userId1, Long userId2, 
                                        LocalDateTime startTime, LocalDateTime endTime);
    
    /**
     * 搜索消息内容
     */
    List<Message> searchMessages(Long userId1, Long userId2, String keyword);
    
    /**
     * 获取系统消息
     */
    IPage<Message> getSystemMessages(Long userId, int page, int size);
    
    /**
     * 获取消息详情
     */
    Message getMessageById(Long messageId, Long userId);
    
    /**
     * 更新消息状态
     */
    boolean updateMessageStatus(Long messageId, String status);
    
    /**
     * 获取用户消息统计
     */
    Map<String, Object> getMessageStatistics(Long userId);
    
    /**
     * 清理过期消息
     */
    int cleanExpiredMessages(int days);
    
    /**
     * 验证用户是否有权限访问消息
     */
    boolean hasPermission(Long messageId, Long userId);
    
    /**
     * 获取消息的回复列表
     */
    List<Message> getMessageReplies(Long messageId);
    
    /**
     * 转发消息
     */
    Message forwardMessage(Long messageId, Long senderId, Long receiverId);
    
    /**
     * 获取用户今日消息数量
     */
    Long getTodayMessageCount(Long userId);
    
    /**
     * 检查消息发送频率限制
     */
    boolean checkRateLimit(Long userId);
}